package com.huanletao.sshftp;

import com.jcraft.jsch.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.nio.file.Paths;

/**
 *
 *
 *
 */
public abstract class SFTPFileTransfer {

    private static final Logger logger = LoggerFactory.getLogger(SFTPFileTransfer.class);
    private static final int CHANNEL_TIMEOUT = 5000; //管道流超时时间
    private static Session jschSession = null;

    /**
     * 登录远程服务器。
     *
     */
    public static void loginssh(String username,String password,String remoteHost,int remotePort) {
        JSch jsch = new JSch();
        // jsch.setKnownHosts("/home/zimug/.ssh/known_hosts");
        try {
            jschSession = jsch.getSession(username, remoteHost, remotePort);
            jschSession.setConfig("StrictHostKeyChecking", "no");
            // 通过密码的方式登录认证
            jschSession.setPassword(password);
            jschSession.connect(1000);
        } catch (JSchException e) {
            logger.error(e.getMessage(),e);
            throw new RuntimeException("ssh 登录失败");
        }
        // 通过ssh私钥的方式登录认证
        // jsch.addIdentity("/home/zimug/.ssh/id_rsa");

        logger.info("登录成功,用户名{}",username);
    }

    /**
     *  ssh scp 下载文件到本地、
     * @param localFile
     * @param remoteFile
     */
    public static void downloadRemoteFile(String localFile, String remoteFile) {
        try {

            Channel sftp = jschSession.openChannel("sftp");  //建立sftp文件传输管道
            sftp.connect(CHANNEL_TIMEOUT);
            ChannelSftp channelSftp = (ChannelSftp) sftp;
            if (!Paths.get(localFile).toFile().getParentFile().exists()) {
                Paths.get(localFile).toFile().getParentFile().mkdirs();
            }
            channelSftp.get(remoteFile, localFile);
            channelSftp.exit();
        } catch (JSchException | SftpException e) {
           logger.error(e.getMessage(),e);
        } finally {
            if (jschSession != null) {
                jschSession.disconnect();
            }
        }
        logger.info("文件传输完成！本地路径是：{},远程路径{}",localFile,remoteFile);
    }

    /**
     *  ssh scp 上传文件到远程服务器。
     *
     * @param localFile
     * @param remoteFile
     */
    public static void uploadRemoteFile(String localFile, String remoteFile) {
        try {
            Channel sftp = jschSession.openChannel("sftp");  //建立sftp文件传输管道
            sftp.connect(CHANNEL_TIMEOUT);
            ChannelSftp channelSftp = (ChannelSftp) sftp;
            // 传输本地文件到远程主机

           channelSftp.put(localFile, remoteFile);
           channelSftp.exit();
        } catch (JSchException | SftpException e) {
              logger.error(e.getMessage(),e);
        } finally {
            if (jschSession != null) {
                jschSession.disconnect();
            }
        }
        logger.info("文件传输完成！本地路径是：{},远程路径{}",localFile,remoteFile);
    }

}
